package com.heima.feign.clients;

import com.heima.feign.fallback.FeignFallback;
import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.article.pojos.ApArticle;
import com.heima.model.common.dtos.ResponseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 远程调用文章服务
 * TODO:熔断降级——微服务保护【防止突然高并发得请求，使得服务阻塞、崩溃】
 *      注意：熔断可以让服务请求失败（后续可以继续请求，直至成功），但是不会导致阻塞
 *      hytricx熔断降级——
 *          【1】给接口创建降级方法    A:fallback模式=直接给接口创建实现类
 *                                  B:fallbackFactory模式=实现接口FallbackFactory<T>，捕获远程接口异常（推荐）
 *          【2】在远程接口FeignClient上添加属性=》fallbackFactory = xx.class
 *          【3】调用方启动类上扫描是降级类==
 *              @ComponentScan(basePackages = {"服务本地包路径","feign中降级类路径"})
 */
//@FeignClient(value = "leadnews-article",path = "/api/v1/article",)
@FeignClient(value = "leadnews-article",path = "/api/v1/article",fallbackFactory = FeignFallback.class)
//@FeignClient(value = "leadnews-article")
public interface ArticleClient {
    /**
     * 添加文章
     * @param dto
     * @return
     */
    @PostMapping("/save")
    public ResponseResult<Long> saveArticle(@RequestBody ArticleDto dto);

    /**
     * 根据id查询文章
     */
    @GetMapping("/{id}")
    public ApArticle findById(@PathVariable Long id);
}
